#!/bin/bash

# 设置工作目录和输出目录，在workdir中输入所在的工作路径，将原始数据放到该工作路径中
workdir="/media/gm/新加卷/CCNPIBP2"
NIFTI_DIR="${workdir}/nifti"
rawdata_dir="${workdir}/rawdata"

#设置被试列表文件
sub_list="${rawdata_dir}/subs.list"

# 检查并生成 NIFTI_DIR 目录
if [ ! -d "$NIFTI_DIR" ]; then
    mkdir -p "$NIFTI_DIR"
    echo "NIFTI 文件夹不存在，已创建：$NIFTI_DIR"
fi

# 检查被试列表文件是否存在，如果不存在则生成
if [ ! -f "$sub_list" ]; then
    # 生成 subs.list 文件，仅包含 rawdata 目录下的一级子目录名称
    find "$rawdata_dir" -mindepth 1 -maxdepth 1 -type d -exec basename {} \; > "$sub_list"
    echo "已生成被试列表文件：$sub_list"
fi

# 读取被试列表到数组，过滤掉空行和注释行
mapfile -t subjects < <(grep -vE '^\s*#|^\s*$' "$sub_list")

# 确保所有输出子文件夹都存在
for subj in "${subjects[@]}"; do
    mkdir -p "${NIFTI_DIR}/${subj}"
done

# 导出环境变量以便子进程访问
export NIFTI_DIR
export workdir
export rawdata_dir

# 并行化转换，仅处理尚未转换的文件夹
parallel -j 4 '
    subj={}
    input_dir="${rawdata_dir}/${subj}"
    output_dir="${NIFTI_DIR}/${subj}"

    # 检查输出文件夹中是否已有 NIfTI 文件
    if [ -z "$(ls -A "${output_dir}"/*.nii.gz 2>/dev/null)" ]; then
        echo "正在将 ${input_dir} 转换到 ${output_dir}"
        if dcm2niix -z y -b y -o "${output_dir}" "${input_dir}"; then
            echo "${subj} 的转换已成功完成。"
        else
            echo "错误：${subj} 的转换失败。" >&2
        fi
    else
        echo "跳过 ${input_dir} - 已转换。"
    fi
' ::: "${subjects[@]}"

echo "所有转换已完成！"


